package com.haotunet.app.goldtreasure.utils;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;

public class MathUtils {
	/**
	 * 保留2位小数
	 * 
	 * @param d
	 * @return
	 * @return double
	 * @author jason
	 * @date 2016年3月23日
	 */
	public static double keepTwoDecimalPlaces(double d) {
		DecimalFormat df = new DecimalFormat("#0.00");
		return Double.valueOf(df.format(d));
	}

	/**
	 * 保留2位小数
	 * 
	 * @param b
	 * @return
	 * @return String
	 * @author jason
	 * @date 2016年3月30日
	 */
	public static String keepTwoDecimalPlaces(BigDecimal b) {
		DecimalFormat df = new DecimalFormat("#0.00");
		return df.format(b);
	}

	/**
	 * 计算a*b保留2位小数
	 * 
	 * @param a
	 * @param b
	 * @return
	 * @return String
	 * @author jason
	 * @date 2016年3月30日
	 */
	public static String decimalMultiplyKeepTwoPlaces(double a, double b) {
		BigDecimal bda = new BigDecimal(a);
		BigDecimal bdb = new BigDecimal(b);
		return keepTwoDecimalPlaces(bda.multiply(bdb));
	}

	/**
	 * 计算a*b保留3位小数
	 * 
	 * @param a
	 * @param b
	 * @return
	 * @return String
	 * @author jason
	 * @date 2016年3月30日
	 */
	public static String decimalMultiplyKeepThreePlaces(double a, double b) {
		BigDecimal bda = new BigDecimal(a);
		BigDecimal bdb = new BigDecimal(b);
		return keepThreeDecimalPlaces(bda.multiply(bdb));
	}
	/**
	 * 计算a*b保留2位小数
	 * 
	 * @param aa
	 * @param bb
	 * @return
	 * @return double
	 * @author jason
	 * @date 2016年3月31日
	 */
	public static double decimalMultiplyKeepThreePlacesDown(double aa, double bb) {
		BigDecimal a = new BigDecimal(aa);
		BigDecimal b = new BigDecimal(bb);
		double mul = Double.parseDouble(keepTwoDecimalPlaces(a.multiply(b)));
		double mul1 = a.multiply(b).doubleValue();
		return mul == mul1 ? mul : decimalAddKeepTwoPlaces(mul1, -0.01);
	}
	/**
	 * 计算a*b保留2位小数
	 * 
	 * @param a
	 * @param b
	 * @return
	 * @return double
	 * @author jason
	 * @date 2016年3月31日
	 */
	public static double decimalMultiplyKeepTwoPlaces(BigDecimal a, BigDecimal b) {
		double mul = Double.parseDouble(keepTwoDecimalPlaces(a.multiply(b)));
		double mul1 = a.multiply(b).doubleValue();
		return mul == mul1 ? mul : decimalAddKeepTwoPlaces(mul1, 0.01);
	}
	
	/**
	 * 计算a*b保留2位小数
	 * 
	 * @param a
	 * @param b
	 * @return
	 * @return double
	 * @author jason
	 * @date 2016年3月31日
	 */
	public static double decimalMultiplyKeepTwoPlacesDown(BigDecimal a, BigDecimal b) {
		double mul = Double.parseDouble(keepTwoDecimalPlaces(a.multiply(b)));
		double mul1 = a.multiply(b).doubleValue();
		return mul == mul1 ? mul : decimalAddKeepTwoPlaces(mul1, -0.01);
	}

	/**
	 * 计算a+b+c保留2位小数
	 * 
	 * @param a
	 * @param b
	 * @param c
	 * @return
	 * @return double
	 * @author jason
	 * @date 2016年4月5日
	 */
	public static double decimalAddKeepTwoPlaces(double a, double b, double c) {
		BigDecimal dba = new BigDecimal(a);
		BigDecimal dbb = new BigDecimal(b);
		BigDecimal dbc = new BigDecimal(c);
		return keepTwoDecimalPlaces(dba.add(dbb).add(dbc).doubleValue());
	}

	/**
	 * 计算a+b+c保留2位小数
	 * 
	 * @param a
	 * @param b
	 * @param c
	 * @return
	 * @return double
	 * @author jason
	 * @date 2016年4月5日
	 */
	public static double decimalAddKeepThreePlaces(double a, double b, double c) {
		BigDecimal dba = new BigDecimal(a);
		BigDecimal dbb = new BigDecimal(b);
		BigDecimal dbc = new BigDecimal(c);
		return keepThreeDecimalPlaces(dba.add(dbb).add(dbc).doubleValue());
	}
	
	/**
	 * 计算a+b+c保留2位小数
	 * 
	 * @param a
	 * @param b
	 * @param c
	 * @return
	 * @return double
	 * @author jason
	 * @date 2016年4月5日
	 */
	public static double decimalAddKeepThreePlaces(double a, double b, double c, double d) {
		BigDecimal dba = new BigDecimal(a);
		BigDecimal dbb = new BigDecimal(b);
		BigDecimal dbc = new BigDecimal(c);
		BigDecimal dbd = new BigDecimal(d);
		return keepThreeDecimalPlaces(dba.add(dbb).add(dbc).add(dbd).doubleValue());
	}

	/**
	 * 计算a+b保留2位小数
	 * 
	 * @param a
	 * @param b
	 * @return
	 * @return double
	 * @author jason
	 * @date 2016年4月5日
	 */
	public static double decimalAddKeepTwoPlaces(double a, double b) {
		BigDecimal dba = new BigDecimal(a);
		BigDecimal dbb = new BigDecimal(b);
		return keepThreeDecimalPlaces(dba.add(dbb).doubleValue());
	}

	/**
 	 *	a-b保留3位小数
	 * 
	 * @param a
	 * @param b
	 * @return
	 * @return double
	 * @author jason
	 * @date 2016年4月5日
	 */
	public static double decimalReduceKeepTwoPlaces(double a, double b) {
		BigDecimal dba = new BigDecimal(a);
		BigDecimal dbb = new BigDecimal(b);
		return keepTwoDecimalPlaces(dba.subtract(dbb).doubleValue());
	}

	/**
	 * a-b保留2位小数
	 * 
	 * @param a
	 * @param b
	 * @return
	 * @return double
	 * @author jason
	 * @date 2016年4月5日
	 */
	public static double decimalReduceKeepThreePlaces(double a, double b) {
		BigDecimal dba = new BigDecimal(a);
		BigDecimal dbb = new BigDecimal(b);
		return keepThreeDecimalPlaces(dba.subtract(dbb).doubleValue());
	}

	public static double decimalReduceKeepTwoPlaces(double a, double b, double c) {
		BigDecimal dba = new BigDecimal(a);
		BigDecimal dbb = new BigDecimal(b);
		BigDecimal dbc = new BigDecimal(c);
		return keepTwoDecimalPlaces(dba.subtract(dbb).subtract(dbc).doubleValue());
	}

	public static double decimalReduceKeepThreePlaces(double a, double b, double c) {
		BigDecimal dba = new BigDecimal(a);
		BigDecimal dbb = new BigDecimal(b);
		BigDecimal dbc = new BigDecimal(c);
		return keepThreeDecimalPlaces(dba.subtract(dbb).subtract(dbc).doubleValue());
	}

	/**
	 * 保留3位小数
	 * 
	 * @param total_gold
	 * @return
	 */
	public static double keepThreeDecimalPlaces(double total_gold) {
		DecimalFormat df = new DecimalFormat("#0.000");
		return Double.valueOf(df.format(total_gold));
	}

	/**
	 * 保留3位小数
	 * 
	 * @param b
	 * @return
	 */
	public static String keepThreeDecimalPlaces(BigDecimal b) {
		DecimalFormat df = new DecimalFormat("#0.000");
		return df.format(b);
	}

	/**
	 * a/b保留3位小数
	 * 
	 * @param a
	 * @param b
	 * @return
	 * @return String
	 * @author jason
	 * @date 2016年4月21日
	 */
	public static String decimalADivideB(String a, String b) {
		BigDecimal ba = new BigDecimal(a);
		BigDecimal bb = new BigDecimal(b);
		return keepThreeDecimalPlaces(ba.divide(bb, 3, RoundingMode.FLOOR));
	}

	
	/**
	 * a/b保留3位小数
	 * 
	 * @param a
	 * @param b
	 * @return
	 * @return String
	 * @author jason
	 * @date 2016年4月21日
	 */
	public static BigDecimal decimalADivideB(double a, double b) {
		BigDecimal ba = new BigDecimal(a);
		BigDecimal bb = new BigDecimal(b);
		return ba.divide(bb, 3, RoundingMode.FLOOR);
	}

	public static double decimalAddThreeTwoPlaces(double a, double b) {
		BigDecimal dba = new BigDecimal(a);
		BigDecimal dbb = new BigDecimal(b);
		return keepThreeDecimalPlaces(dba.add(dbb).doubleValue());
	}

	/**
	 * double保存3位小数
	 * @param a
	 * @return
	 * @return double
	 * @author jason
	 * @date 2016年6月10日
	 */

	public static double get3Double(double a) {
		int inta = (int) (a * 1000);
		return inta / 1000.0;
	}

	
	/**
	 * 返回原值的百分比
	 * @param original
	 * @param pa
	 * @param pb
	 * @return
	 * @return double
	 * @author jason
	 * @date 2016年6月10日
	 */
	public static double numberDivideByPercent(double original, double pa, double pb) {
		String result = keepThreeDecimalPlaces(decimalADivideB(pa, pb).multiply(new BigDecimal(original)));
		return Double.parseDouble(result);
	}

	public static void main(String[] args) {
		String a = "130";
		String b = "268.79";
		System.out.println(decimalADivideB(a, b));
	}
}
